#include"StudentManage.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */


int main()
{
	//创建一个新节点（车厢）
	Node* pNewNode = (Node*)malloc(sizeof(Node));//划分一个节点的内存
	Node *g_pHead = NULL;
	while (1)//这是一个死循环~
	{
		welcome();//欢迎
		char ch = getch();//从键盘上接收一个字符
		switch (ch)
		{
		case'1'://录入学生信息
			Inputstudent();
			break;
		case'2'://打印学生信息
			Printstudent();
			break;
		case'3'://保存学生信息
			Savestudent();
			break;
		case'4'://统计学生信息
			printf("学生总人数为:%d\n", Countstudent());
			system("pause");//暂停
			system("cls"); //清屏
			break;
		case'5'://查找学生信息
		{
					Node* p = Findstudent();//将指针转化成信息
					if (p != NULL)//如果找到了就打印出来
					{
						printf("*学号:%d\t*姓名:%s\t*年龄:%d\t*英语:%.2lf\t*数学:%.2lf\t*C语言:%.2lf\n", p->stu.ID,
							p->stu.name, p->stu.age, p->stu.Eng, p->stu.math, p->stu.c);
					}
					else
						printf("抱歉，没有找到该学生。");

					system("pause");//暂停
					system("cls"); //清屏
					break;
		}

		case'6'://修改学生信息
			Modifystudent();
			break;
		case'7'://删除学生信息
			Deletestudent();
			break;
		case'8'://按成绩排序
			Sortstudent();
			break;
		case'9'://退出系统
			printf("Goodbye~\n");
			return 0;
		default:
			printf("您的输入有误，请重新输入。\n");
			system("pause");//暂停
			system("cls"); //清屏
			break;
		}
	}
	return 0;
}


//欢迎
void welcome()
{
	printf("*********************************************************\n");
	printf("*\t\t欢迎使用高校学生成绩管理系统\t\t*\n");
	printf("*********************************************************\n");
	printf("*\t\t请选择功能表\t\t\t\t*\n");
	printf("*********************************************************\n");
	printf("*\t\t1.录入学生信息\t\t\t\t*\n");
	printf("*\t\t2.打印学生信息\t\t\t\t*\n");
	printf("*\t\t3.保存学生信息\t\t\t\t*\n");
	printf("*\t\t4.统计学生人数\t\t\t\t*\n");
	printf("*\t\t5.查找学生信息\t\t\t\t*\n");
	printf("*\t\t6.修改学生信息\t\t\t\t*\n");
	printf("*\t\t7.删除学生信息\t\t\t\t*\n");
	printf("*\t\t8.按成绩排序\t\t\t\t*\n");
	printf("*\t\t9.退出系统\t\t\t\t*\n");
	printf("*********************************************************\n");

}


//录入学生信息
void Inputstudent()
{
	//创建一个新节点（车厢）
	Node* pNewNode = (Node*)malloc(sizeof(Node));//划分一个节点的内存
	pNewNode->pNext = NULL;
	//头插法
	if (g_pHead == NULL)//车厢里没东西
	{
		g_pHead = pNewNode;
	}
	else
	{
		pNewNode->pNext = g_pHead;
		g_pHead = pNewNode;
	}

	printf("请输入学生姓名:\n");
	scanf("%s", pNewNode->stu.name);//从键盘格式化接受一个字符串，整数等等
	printf("请输入学生的年龄:\n");
	scanf("%d", &pNewNode->stu.age);
	printf("请输入学号:\n");
	scanf("%d", &pNewNode->stu.ID);
	printf("请输入英语成绩:\n");
	scanf("%lf", &pNewNode->stu.Eng);
	printf("请输入数学成绩:\n");
	scanf("%lf", &pNewNode->stu.math);
	printf("请输入C语言成绩:\n");
	scanf("%lf", &pNewNode->stu.c);

	printf("学生信息录入成功。\n");
	system("pause");//使页面暂停打印
}

//打印学生信息
void Printstudent()
{
	system("cls"); //清屏
	printf("*********************************************************\n");
	printf("*\t\t欢迎使用高校学生成绩管理系统\t\t*\n");
	printf("*********************************************************\n");
	printf("*学号\t*姓名\t*年龄\t*英语\t*数学\t*C语言\n");
	printf("*********************************************************\n");

	//遍历链表
	Node* p = g_pHead;//指向头结点
	while (p != NULL)
	{
		printf("*%d\t*%s\t*%d\t*%.2lf\t*%.2lf\t*%.2lf\n", p->stu.ID, p->stu.name, p->stu.age, p->stu.Eng, p->stu.math, p->stu.c);
		p = p->pNext;
	}

	printf("*********************************************************\n");
	system("pause");//暂停
	system("cls"); //清屏
}


//保存学生信息
void Savestudent()
{
	//打开文件
	FILE* fp = fopen("C:\\stumanager.txt", "w");

	if (fp == NULL)
	{
		printf("打开文件失败。\n");
		return;
	}
	//遍历链表
	Node* p = g_pHead;//指向头结点
	while (p != NULL)
	{
		fwrite(&p->stu, 1, sizeof(Student), fp);
		p = p->pNext;
	}
	//关闭文件
	fclose(fp);
	printf("文件保存成功！\n");
}


//统计学生人数
int Countstudent()
{
	int nCount = 0;//学生总数

	//遍历链表
	Node* p = g_pHead;//指向头结点
	while (p != NULL)
	{
		nCount++;
		p = p->pNext;
	}
	return nCount;

}


//查找学生信息
Node* Findstudent()
{
	int nstuID;
	char stuName[50];
	printf("请输入要查找学生的学号");
	scanf("%d", &nstuID);
	printf("请输入要查找学生的姓名");
	scanf("%s", stuName);

	//遍历链表
	Node* p = g_pHead;//指向头结点
	while (p != NULL)
	{
		if (p->stu.ID == nstuID || 0 == strcmp(p->stu.name, stuName))//strcmp比较函数，当返回值=0即名字一样
		{
			return p;
		}
		p = p->pNext;

	}
	//没找到
	return NULL;
}


//修改学生信息
void Modifystudent()
{
	int nstuID;
	printf("请输入需要修改的学生信息的学号:\n");
	scanf("%d", &nstuID);

	//遍历链表
	Node* p = g_pHead;//指向头结点
	while (p != NULL)
	{
		if (p->stu.ID == nstuID)
		{
			printf("请输入要修改的学生姓名 年龄 英语成绩 数学成绩 C语言成绩:\n");
			scanf("%s %d %.2lf %.2lf %.2lf", p->stu.name, &p->stu.age, &p->stu.Eng, &p->stu.math, &p->stu.c);
			printf("修改成功.\n");
			break;
		}
		p = p->pNext;

	}

	if (p == NULL)
	{
		printf("没有找到该学生信息\n");
	}

}


//删除学生信息
void Deletestudent()
{
	int nstuID;
	printf("请输入需要删除的学生信息的学号:\n");
	scanf("%d", &nstuID);
	//遍历链表
	Node* p1;//p1为备份的头节点
	//判断是不是头结点
	if (g_pHead->stu.ID == nstuID)//是头结点
	{
		p1 = g_pHead;//因为要将头结点删除，备份一个头节点
		g_pHead = g_pHead->pNext;
		free(p1);//释放内存
		system("pause");//暂停
		system("cls"); //清屏
		return;
	}
	//不是头结点
	Node* p = g_pHead;
	Node* p2;//p2为备份的头节点
	while (p->pNext != NULL)
	{
		if (p->pNext->stu.ID == nstuID)
		{
			p2 = p->pNext;
			p->pNext = p->pNext->pNext;//覆盖
			free(p2);//释放内存
			system("pause");//暂停
			system("cls"); //清屏
			return;
		}
		p = p->pNext;

		if (p->pNext == NULL)
		{
			break;
		}
		if (p->pNext == NULL)//全都找完没找到 
		{
			printf("没有找到该学生.\n");
			system("pause");//暂停
			system("cls"); //清屏
		}
	}
}



void Sortstudent()
{
	while (1) // 无限循环，直到用户选择退出
	{
		system("cls"); // 清屏
		printf("*********************************************************\n");
		printf("*\t\t欢迎使用高校学生成绩管理系统\t\t*\n");
		printf("*********************************************************\n");
		printf("******   \t请选择排序方式\t     *****\n");
		printf("1.***按学号排序***\n");
		printf("2.***按英语成绩排序***\n");
		printf("3.***按数学成绩排序***\n");
		printf("4.***按C语言成绩排序***\n");
		printf("5.***退出该系统***\n");
		printf("请输入您的选择:\n");

		char ch = getch(); // 从键盘获取一个字符

		switch (ch)
		{
		case '1': // 按学号排序
		{
					  // 按学号排序
					  Node *current = g_pHead;
					  while (current != NULL)
					  {
						  Node *nextNode = current->pNext;
						  while (nextNode != NULL)
						  {
							  if (current->stu.ID > nextNode->stu.ID)
							  {
								  Student temp = current->stu;
								  current->stu = nextNode->stu;
								  nextNode->stu = temp;
							  }
							  nextNode = nextNode->pNext;
						  }
						  current = current->pNext;
					  }
					  printf("按学号排序完成。\n");
					  break;
		}
		case '2': // 按英语成绩排序
		{
					  // 按英语成绩排序
					  Node *current = g_pHead;
					  while (current != NULL)
					  {
						  Node *nextNode = current->pNext;
						  while (nextNode != NULL)
						  {
							  if (current->stu.Eng < nextNode->stu.Eng)
							  {
								  Student temp = current->stu;
								  current->stu = nextNode->stu;
								  nextNode->stu = temp;
							  }
							  nextNode = nextNode->pNext;
						  }
						  current = current->pNext;
					  }
					  printf("按英语成绩排序完成。\n");
					  break;
		}
		case '3': // 按数学成绩排序
		{
					  // 按数学成绩排序
					  Node *current = g_pHead;
					  while (current != NULL)
					  {
						  Node *nextNode = current->pNext;
						  while (nextNode != NULL)
						  {
							  if (current->stu.math < nextNode->stu.math)
							  {
								  Student temp = current->stu;
								  current->stu = nextNode->stu;
								  nextNode->stu = temp;
							  }
							  nextNode = nextNode->pNext;
						  }
						  current = current->pNext;
					  }
					  printf("按数学成绩排序完成。\n");
					  break;
		}
		case '4': // 按C语言成绩排序
		{
					  // 按C语言成绩排序
					  Node *current = g_pHead;
					  while (current != NULL)
					  {
						  Node *nextNode = current->pNext;
						  while (nextNode != NULL)
						  {
							  if (current->stu.c < nextNode->stu.c)
							  {
								  Student temp = current->stu;
								  current->stu = nextNode->stu;
								  nextNode->stu = temp;
							  }
							  nextNode = nextNode->pNext;
						  }
						  current = current->pNext;
					  }
					  printf("按C语言成绩排序完成。\n");
					  break;
		}
		case '5': // 退出系统
			printf("Goodbye~\n");
			return;
		default: // 处理无效输入
			printf("您的输入有误，请重新输入。\n");
			system("pause"); // 暂停系统
			break;
		}

		// 输出完整的成绩单
		printf("*********************************************************\n");
		printf("*学号\t*姓名\t*年龄\t*英语\t*数学\t*C语言\n");
		printf("*********************************************************\n");

		Node *p = g_pHead; // 指向头结点
		while (p != NULL)
		{
			printf("*%d\t*%s\t*%d\t*%.2lf\t*%.2lf\t*%.2lf\n", p->stu.ID, p->stu.name, p->stu.age, p->stu.Eng, p->stu.math, p->stu.c);
			p = p->pNext;
		}

		printf("*********************************************************\n");
		system("pause"); // 暂停系统
	}
}

